/**
 * 
 */
package model;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.DefaultListModel;

import controller.MenueController;
import datenbank.Initialisierung;

/**
 * Model fuer die Fehlermeldungsliste
 * 
 * @date 04.01.2012
 * @author rs
 * @version 1.0
 * 
 */
public class ListeErrorModel extends DefaultListModel implements
		PropertyChangeListener {

	private MenueController menueController;
	private Initialisierung initialisierung;

	private File datei;
	private File archivDatei;;

	private BufferedReader br;
	private ArrayList<String> meldungen = new ArrayList<String>();
	private ArrayList<String> archiv = new ArrayList<String>();

	private final String IOCHANGE = "IOCHANGE";

	// private String[] ioGesp = new String[32];
	private ArrayList<String> zwischenSpeichern = new ArrayList<String>();
	private String[] kopf;

	private Date d;
	private BufferedWriter bf;

	/**
	 * Konstruktor
	 * 
	 * @param menueController
	 */
	public ListeErrorModel(MenueController menueController, Initialisierung initialisierung) {
		super();
		
		this.menueController = menueController;
		this.initialisierung = initialisierung;
		
		this.menueController.getMenueModel().addPropertyChangeListener(this);

		
		
		datei = new File(this.initialisierung.getPfadStoermeldungen());
		archivDatei = new File(this.initialisierung.getPfadArchiv());
		
		
		// Neuer Thread
		new Thread() {
			public void run() {
				try {

					meldungenAusl();

					archivAusl();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}.start();

		d = new Date();

		SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yy");
		String datum = formatter.format(d);

		kopf = new String[4];
		kopf[0] = ";*****************************";
		kopf[1] = ";***        Archiv         ***";
		kopf[2] = ";*** Erstellt am: " + datum + " ***";
		kopf[3] = ";*****************************";
	}

	/**
	 * Nach dem aufstarten der Software werden hier alle Meldungstext aus der
	 * Datenbank gelesen
	 * 
	 * @throws IOException
	 */
	private void meldungenAusl() throws IOException {

		br = new BufferedReader(new FileReader(datei));

		String line;

		for (; (line = br.readLine()) != null;) {

			if (line.charAt(0) != ';' && line.equals("EOF") == false) {
				meldungen.add(line);
			}
		}
	}

	/**
	 * Beim aufstarten des Programmes wird das archiv aus dem File geladen
	 * 
	 * @throws IOException
	 */
	private void archivAusl() throws IOException {
		if (!archivDatei.exists()) {
			archivDatei.createNewFile();
		}

		br = new BufferedReader(new FileReader(archivDatei));

		String line;

		for (; (line = br.readLine()) != null;) {

			if (line.charAt(0) != ';' && line.equals("EOF") == false) {
				archiv.add(line);
			}
		}
	}

	/**
	 * Speichert die Daten fuer das Archiv
	 * 
	 * @param text
	 */
	private void saveArchiv(String text) {
		archiv.add(text);

		// Nur 200 nachrichten Speichern
		if (archiv.size() > 200) {
			archiv.remove(archiv.size() - 1);
		}
	}

	/**
	 * Speichert das ganze Archiv
	 * 
	 * @throws IOException
	 */
	public void saveDatei() throws IOException {
		bf = new BufferedWriter(new FileWriter(archivDatei));

		for (int i = 0; i < kopf.length; i++) {
			bf.write(kopf[i]);
			bf.newLine();
		}

		for (String s : archiv) {
			bf.write(s);
			bf.newLine();
		}

		// Ende Linie schreiben
		bf.write("EOF");
		bf.close();
	}

	public void archivLaden() {
		removeAllElements();

		// Archiv laden
		for (String s : archiv) {
			add(0, s);
		}
	}

	/**
	 * Loescht die Eintraege in der Liste
	 */
	public void remove2() {
		removeAllElements();

		zwischenSpeichern.clear();
	}

	/**
	 * Nach Archiv die alten Meldungen wieder oeffnen
	 */
	public void meldungenLaden() {
		removeAllElements();

		for (String s : zwischenSpeichern) {
			add(0, s);
		}
	}

	/**
	 * Empfaengt alle aenderungen der Io's
	 */
	@Override
	public void propertyChange(PropertyChangeEvent evt) {
		if (evt.getPropertyName().equals(IOCHANGE)) {

			// Datum Zeit bereitsetllen
			d = new Date();
			SimpleDateFormat formatter = new SimpleDateFormat(
					"yyyy.MM.dd' 'HH:mm)");
			String datum = formatter.format(d);

			if ((Integer) evt.getOldValue() >= 32) {
				// -32 damit es ein gesamter DoppelWort gibt
				int bitNr = (Integer) evt.getOldValue() - 32;

				if (evt.getNewValue().equals("1")) {
					// Meldung aufbereiten
					String s = datum + ": " + meldungen.get(bitNr);

					zwischenSpeichern.add(s);

					// Meldung der Liste anfuegen
					add(0, s);
					// Wert in Array speichern
					// ioGesp[bitNr] = "1";
					// Meldung ins Archiev legen
					saveArchiv(s);
				} else {
					// ioGesp[bitNr] = "0";
				}
			}
		}
	}
}
